home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm2.lha / SORGENTI6 / LEZIONE10c3.s / LEZIONE10c3.s
Text File  |  1995-10-23  |  10KB  |  291 lines

  1.  
  2. ; Lezione10c3.s    Effetto riflettore
  3. ;        Tasto sinistro per uscire.
  4.  
  5.     SECTION    CiriCop,CODE
  6.  
  7. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  8.  
  9. *****************************************************************************
  10.     include    "startup1.s"    ; Salva Copperlist Etc.
  11. *****************************************************************************
  12.  
  13.         ;5432109876543210
  14. DMASET    EQU    %1000001111000000    ; copper,bitplane,blitter DMA
  15.  
  16.  
  17. START:
  18.  
  19.     MOVE.L    #FIGURA,d0    ; punta la figura
  20.     LEA    BPLPOINTERS,A1    ; puntatori COP
  21.     MOVEQ    #3-1,D1        ; numero di bitplanes
  22. POINTBP:
  23.     move.w    d0,6(a1)
  24.     swap    d0
  25.     move.w    d0,2(a1)
  26.     swap    d0
  27.     ADD.L    #40*256,d0    ; + lunghezza bitplane (qua e' alto 256 linee)
  28.     addq.w    #8,a1
  29.     dbra    d1,POINTBP
  30.  
  31.     move.l    #BITPLANE4,d0    ; punta il bitplane dove viene disegnata
  32.     move.w    d0,6(a1)    ; la maschera
  33.     swap    d0
  34.     move.w    d0,2(a1)
  35.  
  36.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  37.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  38.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  39.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  40.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  41.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  42.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  43.  
  44. mouse2:
  45.  
  46. Loop:
  47.     cmp.b    #$ff,$6(a5)    ; VHPOSR - aspetta la linea $ff
  48.     bne.s    loop
  49. Aspetta:
  50.     cmp.b    #$ff,$6(a5)    ; ancora linea $ff?
  51.     beq.s    Aspetta
  52.  
  53.     bsr.s    ClearScreen    ; pulisci schermo
  54.     bsr.w    SpostaMaschera    ; sposta posizione riflettore
  55.     bsr.s    Riflettore    ; routine effetto
  56.  
  57.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  58.     bne.s    mouse2        ; se no, torna a mouse2:
  59.  
  60.     rts
  61.  
  62. ;***************************************************************************
  63. ; Questa routine cancella la porzione di schermo interessata dalla blittata
  64. ;***************************************************************************
  65.  
  66. ClearScreen:
  67.     lea    BITPLANE4+100*40,a1    ; indirizzo zona da cancellare (plane4)
  68.  
  69.     btst    #6,2(a5) ; dmaconr
  70. WBlit1:
  71.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  72.     bne.s    wblit1
  73.  
  74.     move.l    #$01000000,$40(a5)    ; BLTCON0 + BLTCON1. Cancellazone
  75.     move.w    #$0000,$66(a5)
  76.     move.l    a1,$54(a5)
  77.     move.w    #(64*39)+20,$58(a5)
  78.     rts
  79.  
  80. ;*****************************************************************************
  81. ; Questa routine realizza l'effetto riflettore. 
  82. ; Semplicemente la maschera viene disegnata sul bitplane 4
  83. ;*****************************************************************************
  84.  
  85. ;          ___________
  86. ;         /           \
  87. ;        /\            \
  88. ;       / /\____________)____
  89. ;       \/:/\___   ___/\     \
  90. ;        \/ ___ \_/ ___ \     \
  91. ;        ( /  o)   (  o\ )____/
  92. ;         \\__/ /Y\ \__//
  93. ;         (___/(_n_)\___)
  94. ;       __//\ _ _ _ _ /\\__
  95. ;      /==\\_Y Y Y Y Y_//==\
  96. ;     /    `-| | | | |-'    \
  97. ;    /       `-^-^-^-'       \
  98.  
  99. Riflettore:
  100.     lea    BITPLANE4+100*40,a1    ; ind. destinazione
  101.  
  102.     move.w    MascheraX(PC),d0 ; posizione riflettore
  103.     move.w    d0,d2        ; copia
  104.     and.w    #$000f,d0    ; si selezionano i primi 4 bit perche' vanno
  105.                 ; inseriti nello shifter del canale A 
  106.     lsl.w    #8,d0        ; i 4 bit vengono spostati sul nibble alto
  107.     lsl.w    #4,d0        ; della word...
  108.     or.w    #$09F0,d0    ; ...giusti per inserirsi nel registro BLTCON0
  109.                 ; notate LF=$F0 (cioe` copia A in D)
  110.     lsr.w    #3,d2        ; (equivalente ad una divisione per 8)
  111.                 ; arrotonda ai multipli di 8 per il puntatore
  112.                 ; allo schermo, ovvero agli indirizzi dispari
  113.                 ; (anche ai byte, quindi)
  114.                 ; x es.: un 16 come coordinata diventa il
  115.                 ; byte 2 
  116.     and.w    #$fffe,d2    ; escludo il bit 0 del
  117.     add.w    d2,a1        ; somma all'indirizzo del bitplane, trovando
  118.                 ; l'indirizzo giusto di destinazione
  119.  
  120.     btst    #6,2(a5) ; dmaconr
  121. WBlit2:
  122.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  123.     bne.s    wblit2
  124.  
  125.     move.l    #$ffffffff,$44(a5)    ; maschere
  126.     move.w    d0,$40(a5)        ; BLTCON0
  127.     move.w    #$0000,$42(a5)        ; BLTCON1 modo ascendente
  128.     move.w    #0,$64(a5)        ; BLTAMOD (=0)
  129.     move.w    #32,$66(a5)        ; BLTDMOD (40-8=32)
  130.  
  131.     move.l    #Maschera,$50(a5)    ; BLTAPT  puntatore sorgente
  132.     move.l    a1,$54(a5)        ; BLTDPT  puntatore destinazione
  133.     move.w    #(64*39)+4,$58(a5)    ; BLTSIZE (via al blitter !)
  134.                     ; larghezza 4 word
  135.                     ; altezza 39 linee
  136.  
  137.     rts
  138.  
  139. ;*****************************************************************************
  140. ; Questa routine legge la coordinata orizzontale da una tabella
  141. ; e la memorizza nella variabile MASCHERAX
  142. ;*****************************************************************************
  143.  
  144. SpostaMaschera:
  145.     ADDQ.L    #2,TABXPOINT        ; Fai puntare alla word successiva
  146.     MOVE.L    TABXPOINT(PC),A0    ; indirizzo contenuto in long TABXPOINT
  147.                     ; copiato in a0
  148.     CMP.L    #FINETABX-2,A0      ; Siamo all'ultima word della TAB?
  149.     BNE.S    NOBSTARTX        ; non ancora? allora continua
  150.     MOVE.L    #TABX-2,TABXPOINT     ; Riparti a puntare dalla prima word-2
  151. NOBSTARTX:
  152.     MOVE.W    (A0),MascheraX        ; copia il valore nella variabile
  153.     rts
  154.  
  155. MascheraX:
  156.         dc.w    0    ; posizione attuale maschera
  157. TABXPOINT:
  158.         dc.l    TABX    ; puntatore alla tabella
  159.  
  160. ; tabella posizioni maschera
  161.  
  162. TABX:
  163.     DC.W    $12,$16,$19,$1D,$21,$25,$28,$2C,$30,$34
  164.     DC.W    $37,$3B,$3F,$43,$46,$4A,$4E,$51,$55,$58
  165.     DC.W    $5C,$60,$63,$67,$6A,$6E,$71,$74,$78,$7B
  166.     DC.W    $7F,$82,$85,$89,$8C,$8F,$92,$95,$98,$9C
  167.     DC.W    $9F,$A2,$A5,$A8,$AA,$AD,$B0,$B3,$B6,$B8
  168.     DC.W    $BB,$BE,$C0,$C3,$C5,$C8,$CA,$CC,$CF,$D1
  169.     DC.W    $D3,$D5,$D8,$DA,$DC,$DE,$E0,$E1,$E3,$E5
  170.     DC.W    $E7,$E8,$EA,$EC,$ED,$EE,$F0,$F1,$F2,$F4
  171.     DC.W    $F5,$F6,$F7,$F8,$F9,$FA,$FB,$FB,$FC,$FD
  172.     DC.W    $FD,$FE,$FE,$FF,$FF,$FF,$100,$100,$100,$100
  173.     DC.W    $100,$100,$100,$100,$FF,$FF,$FF,$FE,$FE,$FD
  174.     DC.W    $FD,$FC,$FB,$FB,$FA,$F9,$F8,$F7,$F6,$F5
  175.     DC.W    $F4,$F2,$F1,$F0,$EE,$ED,$EC,$EA,$E8,$E7
  176.     DC.W    $E5,$E3,$E1,$E0,$DE,$DC,$DA,$D8,$D5,$D3
  177.     DC.W    $D1,$CF,$CC,$CA,$C8,$C5,$C3,$C0,$BE,$BB
  178.     DC.W    $B8,$B6,$B3,$B0,$AD,$AA,$A8,$A5,$A2,$9F
  179.     DC.W    $9C,$98,$95,$92,$8F,$8C,$89,$85,$82,$7F
  180.     DC.W    $7B,$78,$74,$71,$6E,$6A,$67,$63,$60,$5C
  181.     DC.W    $58,$55,$51,$4E,$4A,$46,$43,$3F,$3B,$37
  182.     DC.W    $34,$30,$2C,$28,$25,$21,$1D,$19,$16,$12
  183. FINETABX:
  184.  
  185. ;*****************************************************************************
  186.  
  187.     SECTION    GRAPHIC,DATA_C
  188.  
  189. COPPERLIST:
  190.     dc.w    $8E,$2c81    ; DiwStrt
  191.     dc.w    $90,$2cc1    ; DiwStop
  192.     dc.w    $92,$38        ; DdfStart
  193.     dc.w    $94,$d0        ; DdfStop
  194.     dc.w    $102,0        ; BplCon1
  195.     dc.w    $104,0        ; BplCon2
  196.     dc.w    $108,0        ; Bpl1Mod
  197.     dc.w    $10a,0        ; Bpl2Mod
  198.  
  199.     dc.w    $100,$4200    ; bplcon0 - 1 bitplane lowres
  200.  
  201. BPLPOINTERS:
  202.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  203.     dc.w $e4,$0000,$e6,$0000
  204.     dc.w $e8,$0000,$ea,$0000
  205.     dc.w $ec,$0000,$ee,$0000
  206.  
  207. Colours:
  208.     dc.w    $0180,$000    ; colori da 0-7 tutti scuri. In questo modo
  209.                 ; le parti della figura in corrispondenza delle
  210.                 ; quali la maschera non e` disegnata sono
  211.                 ; colorate in modo piu' scuro
  212.     dc.w    $0182,$011    ; color1
  213.     dc.w    $0184,$223    ; color2
  214.     dc.w    $0186,$122    ; color3
  215.     dc.w    $0188,$112    ; color4
  216.     dc.w    $018a,$011    ; color5
  217.     dc.w    $018c,$112    ; color6
  218.     dc.w    $018e,$011    ; color7
  219.  
  220.     dc.w    $0190,$000    ; colori 8-15 contengono la palette
  221.     dc.w    $0192,$475
  222.     dc.w    $0194,$fff
  223.     dc.w    $0196,$ccc
  224.     dc.w    $0198,$999
  225.     dc.w    $019a,$232
  226.     dc.w    $019c,$777
  227.     dc.w    $019e,$444
  228.  
  229.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  230.  
  231. ;*****************************************************************************
  232.  
  233. ; qui c'e` il disegno, largo 320 pixel, alto 256 linee e formato da 3 plane
  234.  
  235. Figura:
  236.     incbin    "amiga.raw"
  237.  
  238. ;*****************************************************************************
  239.  
  240. ; Questa e` la maschera. E` una figura formata da un solo bitplane,
  241. ; alta 39 linee e larga 4 words
  242.  
  243. Maschera:
  244.     dc.l    $00007fc0,$00000000,$0003fff8,$00000000,$000ffffe,$00000000
  245.     dc.l    $001fffff,$00000000,$007fffff,$c0000000,$00ffffff,$e0000000
  246.     dc.l    $01ffffff,$f0000000,$03ffffff,$f8000000,$03ffffff,$f8000000
  247.     dc.l    $07ffffff,$fc000000,$0fffffff,$fe000000,$0fffffff,$fe000000
  248.     dc.l    $1fffffff,$ff000000,$1fffffff,$ff000000,$1fffffff,$ff000000
  249.     dc.l    $3fffffff,$ff800000,$3fffffff,$ff800000,$3fffffff,$ff800000
  250.     dc.l    $3fffffff,$ff800000,$3fffffff,$ff800000,$3fffffff,$ff800000
  251.     dc.l    $3fffffff,$ff800000,$3fffffff,$ff800000,$3fffffff,$ff800000
  252.     dc.l    $1fffffff,$ff000000,$1fffffff,$ff000000,$1fffffff,$ff000000
  253.     dc.l    $0fffffff,$fe000000,$0fffffff,$fe000000,$07ffffff,$fc000000
  254.     dc.l    $03ffffff,$f8000000,$03ffffff,$f8000000,$01ffffff,$f0000000
  255.     dc.l    $00ffffff,$e0000000,$007fffff,$c0000000,$001fffff,$00000000
  256.     dc.l    $000ffffe,$00000000,$0003fff8,$00000000,$00007fc0,$00000000
  257.     
  258. ;*****************************************************************************
  259.  
  260. ; qui c'e` il quarto bitplane, dove viene disegnata la maschera.
  261.  
  262.     SECTION    bitplane,BSS_C
  263. BITPLANE4:
  264.     ds.b    40*256
  265.  
  266.     end
  267.  
  268. ;*****************************************************************************
  269.  
  270. In questo esempio realizziamo un effetto "riflettore" con l'ausilio di un
  271. bitplane maschera. La tecnica e` la seguente. Abbiamo un disegno costituito
  272. da 3 bitplanes larghi 320 pixel e alti 256 linee. Per realizzare l'effetto,
  273. utilizziamo una "maschera", ovvero un disegno di un cerchio formato da 1 solo
  274. bitplane. Questa maschera viene disegnata e spostata su un quarto bitplane,
  275. come se fosse un bob. Siccome viene disegnata su un bitplane separato dalla
  276. figura, non dobbiamo preoccuparci dello sfondo. Si tratta sostanzialmente
  277. dello stesso trucco adottato in lezione9i4.s, l'esempio del bob con lo sfondo
  278. finto. Stavolta pero`, per realizzare l'effetto riflettore, settiamo
  279. diversamente i colori nei registri: la palette della figura a 3 colori,
  280. cioe` i valori che normalmente scriveremmo nei registri COLOR00-COLOR07,
  281. vengono scritti stavolta nei registri COLOR08-COLOR15. Invece, i registri
  282. COLOR00-COLOR07 vengono tutti settati come piu' scuri (o neri). In questo modo,
  283. i pixel dell'immagine in corrispondenza dei quali il quarto bitplane e` settato
  284. a 0 appaiono tutti piu' scuri (avremmo potuto anche annerirli tutti); al
  285. contrario, i pixel dell'immagine in corrispondenza dei quali il quarto
  286. bitplane e` settato a 1 ( cioe` in corrispondenza della maschera) appaiono
  287. con i giusti colori.
  288. Questa tecnica e` molto veloce ma, analogamente all'esempio lezione9i4.s, ha
  289. uno svantaggio: utiliziamo 4 bitplane per un'immagine ad 8 colori.
  290. Nel prossimo esempio vedremo come evitare questo problema.
  291.